package com.herch.common.utils;

import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 描述：静态公共方法 作者：Fei.li02 日期：2023年11月19日 下午3:22:03
 *
 */

public class CommonUtil {

	/**
	 * 描述：获取当前服务器的时间 作者：姚绒 日期：2018年11月19日 下午3:20:34 @return Date @throws
	 */
	public static Date getLocalCurrentTime() {
		return Calendar.getInstance().getTime();
	}


	/**
	 * 描述：根据设置的时间格式转换Date对象 作者：姚绒 日期：2018年11月19日 下午3:20:10 @param
	 * formatString @param date @return String @throws
	 */
	public static String getFormatCurrentTime(String path) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH.mm.ss.SSS");
		String currentdate = sdf.format(new Date());
		if (path.endsWith("\\")) {
			path = path.replaceAll("\\\\", "\\\\\\\\") + currentdate + ".xls";
		} else {
			path = path.replaceAll("\\\\", "\\\\\\\\") + "\\\\" + currentdate + ".xls";
		}
		return path;
	}

	/**
	 * 描述：获取当前服务器时间(时间格式：yyyy-MM-dd) 作者：姚绒 日期：2018年11月19日 下午3:19:57 @return
	 * String @throws
	 */
	public static String getSimpleFormatCurrentDate() {
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
		return sf.format(getLocalCurrentTime());
	}

	/**
	 * 描述：获取当前服务器时间(时间格式：yyyy-MM-dd HH:mm:ss) 作者：姚绒 日期：2018年11月19日 下午3:19:45 @return
	 * String @throws
	 */
	public static String getSimpleFormatTimestamp() {
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
		return sf.format(getLocalCurrentTime());
	}

	/**
	 * 描述：将Date转化为字符串的时间格式(yyyy-MM-dd HH:mm:ss) 作者：姚绒 日期：2018年11月19日
	 * 下午3:19:33 @param date @return String @throws
	 */
	public static String getSimpleFormatTimestampByDate(Date date) {
		if (date == null) {
			return null;
		}
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return sf.format(date);
	}

	/**
	 * 描述：将字符串的时间格式转化为Date(yyyy-MM-dd HH:mm:ss) 作者：姚绒 日期：2018年11月19日
	 * 下午3:19:03 @param simpleFormatTimestamp @return @throws ParseException
	 * Date @throws
	 */
	public static Date getDateBySimpleFormatTimestamp(String simpleFormatTimestamp) throws ParseException {
		if (simpleFormatTimestamp.isEmpty() || simpleFormatTimestamp.length() < 10) {
			return null;
		}
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return sf.parse(simpleFormatTimestamp);
	}

	/**
	 * 描述：将字符串的时间格式转化为Date(yyyyMMddHHmmss) 作者：姚绒 日期：2018年11月19日 下午3:18:51 @param
	 * noFormatTimestamp @return @throws ParseException Date @throws
	 */
	public static Date getDateByNoFormatTimestamp(String noFormatTimestamp) throws ParseException {
		if (noFormatTimestamp.isEmpty() || noFormatTimestamp.length() < 10) {
			return null;
		}
		SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
		return sf.parse(noFormatTimestamp);
	}

	/**
	 * 描述：将字符串的时间formatTimestamp格式转化为Date 作者：姚绒 日期：2018年11月19日 下午3:18:39 @param
	 * formatTimestamp @param formatString @return @throws ParseException
	 * Date @throws
	 */
	public static Date getDateByFormatTimestamp(String formatTimestamp, String formatString) throws ParseException {
		if (formatTimestamp.isEmpty() || formatTimestamp.length() < 10) {
			return null;
		}
		SimpleDateFormat sf = new SimpleDateFormat(formatString);
		return sf.parse(formatTimestamp);
	}

	/**
	 * 描述：获取当前服务器时间(时间格式：yyyyMMddHHmmss) 作者：姚绒 日期：2018年11月19日 下午3:18:26 @return
	 * String @throws
	 */
	public static String getNoFormatTimestamp() {
		SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
		return sf.format(getLocalCurrentTime());
	}

	/**
	 * 描述：将Date转化为字符串的时间格式(时间格式：yyyyMMddHHmmss) 作者：姚绒 日期：2018年11月19日
	 * 下午3:18:12 @param date @return String @throws
	 */
	public static String getNoFormatTimestamp(Date date) {
		if (date == null) {
			return null;
		}
		SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
		return sf.format(date);
	}

	/**
	 * 描述：根据字符和指定的个数生成字符序列 作者：姚绒 日期：2018年11月19日 下午3:17:58 @param character @param
	 * number @return String @throws
	 */
	public static String getCharSequence(char character, int number) {
		StringBuilder charSequence = new StringBuilder();
		for (int i = 0; i < number; i++) {
			charSequence.append(character);
		}
		return charSequence.toString();
	}

	/**
	 * 描述：生成固定长度的随机数 作者：姚绒 日期：2018年11月19日 下午3:17:42 @param numberLength @return
	 * String @throws
	 */
	public static String getRandomNumberByLength(Integer numberLength) {
		StringBuilder randomStrBuilder = new StringBuilder();
		Random random = new Random();
		for (int i = 0; i < numberLength; i++) {
			randomStrBuilder.append(random.nextInt(10));
		}
		return randomStrBuilder.toString();
	}

	/**
	 * 描述：分析url协议类型 作者：姚绒 日期：2018年11月19日 下午3:17:23 @param url @return String @throws
	 */
	public static String analysisUrlModel(String url) {
		String result = "HTTP";
		if (!url.isEmpty() && url.indexOf(":") > 0) {
			String backModel = url.substring(0, url.indexOf(":"));
			if ("HTTPS".equalsIgnoreCase(backModel.trim())) {
				result = "HTTPS";
			}
		}
		return result;
	}

	public String getDocumentSavePath() {
		String addr = "C:\\Users\\yr\\Desktop\\PMS";
		File file = new File(addr);
		if (!file.exists()) {
			file.mkdirs();
		}
		System.out.println("getDocumentSavePath addr：" + addr);
		return addr;
	}

	/**
	 * 实体对象转成Map
	 * 
	 * @param obj 实体对象
	 * @return
	 */
	public static Map<String, Object> object2Map(Object obj) {
		Map<String, Object> map = new HashMap<String, Object>();
		if (obj == null) {
			return map;
		}
		Class<? extends Object> clazz = obj.getClass();
		Field[] fields = clazz.getDeclaredFields();
		try {
			for (Field field : fields) {
				field.setAccessible(true);
				map.put(field.getName(), field.get(obj));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return map;
	}

	/**
	 * 截取字符串str中指定字符 strStart、strEnd之间的字符串
	 * 
	 * @return
	 */
	public static String subString(String str, String strStart, String strEnd) {

		/* 找出指定的2个字符在 该字符串里面的 位置 */
		int strStartIndex = str.indexOf(strStart);
		int strEndIndex = str.indexOf(strEnd);

		/* index 为负数 即表示该字符串中 没有该字符 */
		if (strStartIndex < 0) {
			return str;
		}
		if (strEndIndex < 0) {
			return str;
		}
		/* 开始截取 */
		String result = str.substring(strStartIndex, strEndIndex).substring(strStart.length());
		return result;
	}

	/**
	 * 描述： 作者：姚绒 日期：2019年3月14日 上午8:59:53
	 *
	 */
	public static String getAfterDay(String today) throws ParseException {
		Calendar c = Calendar.getInstance();
		c.setTime(new SimpleDateFormat("yy-MM-dd").parse(today));
		int date = c.get(Calendar.DATE);
		c.set(Calendar.DATE, date + 1);
		String afterDay = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
		System.out.println(afterDay);
		return afterDay;
	}

	public static String getBeforeDay(String today) throws ParseException {
		Calendar c = Calendar.getInstance();
		c.setTime(new SimpleDateFormat("yy-MM-dd").parse(today));
		int date = c.get(Calendar.DATE);
		c.set(Calendar.DATE, date - 1);
		String afterDay = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
		System.out.println(afterDay);
		return afterDay;
	}

	public static String getCRC(String data) {
		data = data.replace(" ", "");
		int len = data.length();
		if (!(len % 2 == 0)) {
			return "0000";
		}
		int num = len / 2;
		byte[] para = new byte[num];
		for (int i = 0; i < num; i++) {
			int value = Integer.valueOf(data.substring(i * 2, 2 * (i + 1)), 16);
			para[i] = (byte) value;
		}
		return getCRC(para);
	}

	/**
	 * 计算CRC16校验码
	 *
	 * @param bytes 字节数组
	 * @return {@link String} 校验码
	 * @since 1.0
	 */
	public static String getCRC(byte[] bytes) {
		// CRC寄存器全为1
		int CRC = 0x0000ffff;
		// 多项式校验值
		int POLYNOMIAL = 0x0000a001;
		int i, j;
		for (i = 0; i < bytes.length; i++) {
			CRC ^= ((int) bytes[i] & 0x000000ff);
			for (j = 0; j < 8; j++) {
				if ((CRC & 0x00000001) != 0) {
					CRC >>= 1;
					CRC ^= POLYNOMIAL;
				} else {
					CRC >>= 1;
				}
			}
		}
		// 结果转换为16进制
		String result = Integer.toHexString(CRC).toUpperCase();
		if (result.length() != 4) {
			StringBuffer sb = new StringBuffer("0000");
			result = sb.replace(4 - result.length(), 4, result).toString();
		}
		//
		// return result.substring(2, 4) + " " + result.substring(0, 2);
		// 交换高低位，低位在前高位在后
		return result.substring(2, 4) + " " + result.substring(0, 2);
	}

	/**
	 * 计算LRC校验码
	 *
	 */
	public static String getLRC(String data) {
		int sum = 0;
		String[] ss = data.split(" ");
		for (int i = 0; i < ss.length; i++) {
			sum += Integer.valueOf(ss[i], 16);
		}
		int dec = 256 - sum % 256;
		String hex = Integer.toHexString(dec).toUpperCase();
		return hex;
	}

	public static String stringToAscii(String data) {
		StringBuilder sb = new StringBuilder();
		byte[] bs = data.replaceAll(" ", "").toUpperCase().getBytes();
		for (int i = 0; i < bs.length; i++)
			sb.append(toHex(bs[i]));
		return sb.toString();
	}

	public static String toHex(int n) {
		StringBuilder sb = new StringBuilder();
		if (n / 16 == 0) {
			return toHexUtil(n);
		} else {
			String t = toHex(n / 16);
			int nn = n % 16;
			sb.append(t).append(toHexUtil(nn));
		}
		return sb.toString();
	}

	private static String toHexUtil(int n) {
		String rt = "";
		switch (n) {
		case 10:
			rt += "A";
			break;
		case 11:
			rt += "B";
			break;
		case 12:
			rt += "C";
			break;
		case 13:
			rt += "D";
			break;
		case 14:
			rt += "E";
			break;
		case 15:
			rt += "F";
			break;
		default:
			rt += n;
		}
		return rt;
	}

	public static String asciiToString(String data) {
		StringBuffer sb = new StringBuffer(data);
		int index;
		for (index = 2; index < sb.length(); index += 3) {
			sb.insert(index, ',');
		}
		String[] array = sb.toString().split(",");
		StringBuffer sbu = new StringBuffer();
		for (int i = 0; i < array.length; i++) {
			int dec = Integer.valueOf(array[i], 16);
			char st = (char) dec;
			sbu.append(st);
		}
		return sbu.toString();
	}

	public static byte[] hexStringToByteArray(String hexString) {
		hexString = hexString.replaceAll(" ", "");
		int len = hexString.length();
		byte[] bytes = new byte[len / 2];
		for (int i = 0; i < len; i += 2) {
			// 两位一组，表示一个字节,把这样表示的16进制字符串，还原成一个字节
			bytes[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4)
					+ Character.digit(hexString.charAt(i + 1), 16));
		}
		return bytes;
	}

	// 字符串转时间戳
	public static Double str2Time(String datetime) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// 设置要读取的时间字符串格式
		Date date = null;
		try {
			date = format.parse(datetime);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// 转换为Date类
		Double timestamp = (double) date.getTime();
		return timestamp;
	}

	public static String bytesToHexString(byte[] bytes) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < bytes.length; i++) {
			String hex = Integer.toHexString(0xFF & bytes[i]);
			if (hex.length() == 1) {
				sb.append('0');
			}
			sb.append(hex);
		}
		return sb.toString();
	}

	public static String hexStr2Str(String hexStr) {
		String str = "0123456789ABCDEF";
		char[] hexs = hexStr.toCharArray();
		byte[] bytes = new byte[hexStr.length() / 2];
		int n;
		for (int i = 0; i < bytes.length; i++) {
			n = str.indexOf(hexs[2 * i]) * 16;
			n += str.indexOf(hexs[2 * i + 1]);
			bytes[i] = (byte) (n & 0xff);
		}
		return new String(bytes);
	}

	/*
	 * 将时间转换为时间戳
	 */
	public static long dateToStamp(String s) throws ParseException {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date = simpleDateFormat.parse(s);
		long ts = date.getTime();
		return ts;
	}

	// 播放音频
	public static void play(String fileUrl) {
		FileInputStream url = null;
		AudioStream audioStream = null;
		try {
			url = new FileInputStream(fileUrl);
			audioStream = new AudioStream(url);
			AudioPlayer.player.stop(audioStream);
			// 使用音频播放器播放声音
			AudioPlayer.player.start(audioStream);
			// 如果为空，关闭资源
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 如果为空，关闭资源
			try {
				if (url == null) {
					url.close();
				}
				if (audioStream == null) {
					audioStream.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

//		try {
//			AudioInputStream ais = AudioSystem.getAudioInputStream(new File(fileUrl));
//			AudioFormat aif = ais.getFormat();
//			SourceDataLine sdl = null;
//			DataLine.Info info = new DataLine.Info(SourceDataLine.class, aif);
//			sdl = (SourceDataLine) AudioSystem.getLine(info);
//			sdl.open(aif);
//			sdl.start();
//
//			int nByte = 0;
//			byte[] buffer = new byte[128];
//			while (nByte != -1) {
//
//				nByte = ais.read(buffer, 0, 128);
//				if (nByte >= 0)
//					sdl.write(buffer, 0, nByte);
//			}
//			sdl.stop();
//
//		} catch (UnsupportedAudioFileException e) {
//			e.printStackTrace();
//		} catch (IOException e) {
//			e.printStackTrace();
//		} catch (LineUnavailableException e) {
//
//			e.printStackTrace();
//		}

	}

	public static String readFile(String fileName) throws IOException {
		File file = new File(fileName);
		String encoding = "UTF-8";
		Long filelength = file.length();
		String result = "";
		byte[] filecontent = new byte[filelength.intValue()];
		FileInputStream in = new FileInputStream(file);
		if (file.exists()) {
			in.read(filecontent);
			result = new String(filecontent, encoding);
			in.close();
		}
		return result;
	}
}
